<?php

/**
 * Created by PhpStorm.
 * User: liupengfei
 * Date: 2017/9/11
 * Time: 15:25
 */
require_once 'sdk/php/lib/XS.php';

class XunSearch
{
    /**
     * @var
     */
    private $_xs;
    /**
     * 索引收据对象
     * @var
     */
    private $_index;
    /**
     * 搜索对象
     * @var
     */
    private $_search;
    /**
     * 搜索项目
     * @var
     */
    private $_project;

    /**
     * XunSearch constructor.
     * @param $project
     */
    public function __construct($project)
    {
        $xs = new XS($project);

        $this->_index   = $xs->getIndex();
        $this->_search  = $xs->getSearch();
        $this->_project = $project;
        $this->_xs      = $xs;

        $this->_search->setCharset('UTF-8');
    }

    /**
     * @return null|XSSearch
     */
    public function getSearch()
    {
        return $this->_xs->getSearch();
    }

    /**
     * @param $keyWord
     * @param int $row
     * @param int $jumpNum
     * @return array
     */
    public function search($keyWord, $row = 10, $jumpNum = 0)
    {
        //开启模糊搜索
        $this->_search->setFuzzy();

        //开启同义词搜索
        $this->_search->setAutoSynonyms();
        $this->_search->setQuery($keyWord);

        //设置搜索结果的数量和偏移用于搜索结果分页
        $this->_search->setLimit($row, $jumpNum);

        //执行搜索
        $data = $this->_search->search();

        //获取搜索结果总数的估算值
        $count = $this->_search->count();

        return array('data'=>$data,'count'=>$count);
    }

    /**
     * 添加/更新索引到索引队列中，默认是更新
     * @param $data
     * @param bool $update
     */
    public function addIndex($data, $update = true)
    {
        $document = new XSDocument();
        $document->setFields($data);

        if ($update) {
            $this->_index->update($document);
        } else {
            $this->_index->add($document);
        }
    }

    /**
     * 刷新索引缓存
     * @return bool
     */
    public function flushIndex()
    {
        return $this->_index->flushIndex();
    }

    /**
     * 完全清空索引数据
     */
    public function clearIndex()
    {
        $this->_index->clean();
    }

    /**
     * 根据主键清除索引数据
     * @param array $id
     * @return bool
     */
    public function deleteIndex($id = [])
    {
        if (empty($id))
            return false;

        $this->_index->del($id);
    }

    /**
     * 获取热门搜索词列表
     * @param $num 需要返回的热门搜索数量上限, 最大值为50
     * @param string $type 排序类型, 默认为 total(搜索总量), 可选值还有 lastnum(上周), currnum(本周)
     * @return mixed
     */
    public function hotWord($num, $type = 'currnum')
    {
        return $this->_search->getHotQuery($num, $type);
    }

    /**
     * 读取展开的搜索词，主要用于做搜索建议和搜索纠错
     * @param $keyWord
     * @param int $num 需要返回的搜索词最大数量 默认为10, 最大值为20
     * @return array 返回展开的搜索词组成的数组
     */
    public function expanded($keyWord, $num = 10)
    {
        return $this->_search->getExpandedQuery($keyWord, $num);
    }

    /**
     * 最近一次搜索的结果匹配总数估算值
     * @return mixed
     */
    public function lastCount()
    {
        return $this->_search->getLastCount();
    }

    /**
     * 添加同义词
     * @param $word
     * @param $Synonym
     */
    public function addSynonym($word,$Synonym)
    {
        $this->_index->addSynonym($word,$Synonym);
    }

    /**
     * 刷新搜索日志
     * @return bool
     */
    public function flushLog()
    {
        return $this->_index->flushLogging();
    }


}